package com.st.qdmall.controller;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.st.qdmall.entity.Goods;
import com.st.qdmall.service.IGoodsService;

@Controller
public class AdminGoodsController {

	@Autowired
	private IGoodsService goodsService;
	
	@RequestMapping("/admin/index.do")
	public ModelAndView index(ModelAndView mv) {
		
		// 把所有的商品信息查询出来
		List<Goods> goodsList = goodsService.getAll();
		
		mv.addObject("goodsList", goodsList);
		
		// 再跳转到模版
		//return "admin/index";
		mv.setViewName("admin/index");
		
		return mv;
	}
	
	/**
	 * 添加商品的页面
	 */
	@GetMapping("/admin/add.do")
	public String add() {
		return "admin/add";
	}
	
	/**
	 * 接收添加商品的请求
	 */
	@PostMapping("/admin/add.do")
	public ModelAndView add(
			Goods goods, // 表单中提交的参数，自动注入到goods对象的属性中
			MultipartFile file, // 单独接收上传的图片
			ModelAndView mv) {
		
		// 将上传的文件，保存到服务器上
		// 上传的路径
		//  C:\ Development\ upload
		String path = "C:\\Development\\upload\\";
		String fileName = file.getOriginalFilename(); // 文件的原名  aaa.jpg
		String uuid = UUID.randomUUID().toString();	// 生成一个随机的UUID字符串 XXXXXX
		// XXXXXXX.jpg
		fileName = uuid + fileName.substring(fileName.lastIndexOf("."));
		
		// IO流
		try {
			// 从上传的文件中， 读取出数据， input
			InputStream is = file.getInputStream();
			OutputStream os = new FileOutputStream(path+fileName);
			
			// 把输入流的数据，保存到输出流上去
			IOUtils.copy(is, os);
			
			// 关闭流
			os.close();
			
			// 图片保存成功后，将图片的名字交给goods对象
			goods.setPic(fileName);
			
			// 将商品的信息写入数据库
			int res = goodsService.add(goods);
			
			if (res>0) {
				// 添加成功
				mv.setViewName("redirect:index.do");
			} else {
				// 添加失败
				mv.addObject("error", "添加失败！");
				mv.setViewName("admin/add");
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			// 图片保存失败
			mv.addObject("error", "图片保存失败");
			mv.setViewName("admin/add");
		}
		
		return mv;
	}
	
	@RequestMapping("/img/{name}")
	public void img(@PathVariable("name")String name,
			HttpServletResponse response) {
		// 从服务器硬盘上读取出文件
		// 交给response返回
		try {
			InputStream is = new FileInputStream("C:\\Development\\upload\\" + name);
			OutputStream os = response.getOutputStream();
			
			IOUtils.copy(is, os);
			
			is.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@GetMapping("/admin/delete/{id}")
	public String delete(@PathVariable("id")Integer id) {
		
		// 调用Service层， 删除商品
		int res = goodsService.delete(id);
		
		return "redirect:/admin/index.do";
	}
	
	/**
	 * 提供编辑的页面
	 */
	@GetMapping("/admin/edit/{id}")
	public ModelAndView edit(
			@PathVariable("id")Integer id,
			ModelAndView mv) {
		
		// 获取指定ID的商品信息
		Goods goods = goodsService.getById(id);
		
		mv.addObject("goods", goods);
		
		// 跳转到修改的页面
		mv.setViewName("admin/edit");
		return mv;
	}
	
	@PostMapping("/admin/edit/{id}")
	public ModelAndView edit(@PathVariable("id")Integer id,
			Goods goods,
			MultipartFile file,
			ModelAndView mv) {
		
		// 将上传的文件，保存到服务器上
		// 上传的路径
		// C:\ Development\ upload
		String path = "C:\\Development\\upload\\";
		String fileName = file.getOriginalFilename(); // 文件的原名 aaa.jpg
		String uuid = UUID.randomUUID().toString(); // 生成一个随机的UUID字符串 XXXXXX
		// XXXXXXX.jpg
		fileName = uuid + fileName.substring(fileName.lastIndexOf("."));

		// IO流
		try {
			// 从上传的文件中， 读取出数据， input
			InputStream is = file.getInputStream();
			OutputStream os = new FileOutputStream(path + fileName);

			// 把输入流的数据，保存到输出流上去
			IOUtils.copy(is, os);

			// 关闭流
			os.close();

			// 图片保存成功后，将图片的名字交给goods对象
			goods.setPic(fileName);
			goods.setId(id);

			// 将商品的信息写入数据库
			int res = goodsService.edit(goods);

			if (res > 0) {
				// 添加成功
				mv.setViewName("redirect:/admin/index.do");
			} else {
				// 添加失败
				mv.addObject("error", "添加失败！");
				mv.setViewName("redirect:/admin/edit/"+id);
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			// 图片保存失败
			mv.addObject("error", "图片保存失败");
			mv.setViewName("redirect:/admin/edit/"+id);
		}

		return mv;
	}
}







